<?php

/**
 * InsAbonnement form.
 *
 * @package    tfe
 * @subpackage form
 * @author     Your name here
 * @version    SVN: $Id: sfDoctrineFormTemplate.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class InsAbonnementForm extends BaseInsAbonnementForm {
    public function configure() {
        unset($this['created_at'], $this['updated_at'], $this['deleted_at']);

        $this->widgetSchema['id_contact']->setOption('renderer_class', 'sfWidgetFormDoctrineJQueryAutocompleter');
        $this->widgetSchema['id_contact']->setOption('renderer_options', array(
                'model' => 'Contact',
                'url'   => '/contact/autocomplete',
        ));

        $this->widgetSchema['id_groupe']->setOption('renderer_class', 'sfWidgetFormDoctrineJQueryAutocompleter');
        $this->widgetSchema['id_groupe']->setOption('renderer_options', array(
                'model' => 'Groupe',
                'url'   => '/groupe/autocomplete',
        ));

        $this->widgetSchema['id_abonnement']->setOption('renderer_class', 'sfWidgetFormDoctrineJQueryAutocompleter');
        $this->widgetSchema['id_abonnement']->setOption('renderer_options', array(
                'model' => 'Abonnement',
                'url'   => '/abonnement/autocomplete',
        ));

        $this->widgetSchema['parrain']->setOption('renderer_class', 'sfWidgetFormDoctrineJQueryAutocompleter');
        $this->widgetSchema['parrain']->setOption('renderer_options', array(
                'model' => 'Contact',
                'url'   => '/contact/autocomplete',
        ));

        $this->widgetSchema['parent']->setOption('renderer_class', 'sfWidgetFormDoctrineJQueryAutocompleter');
        $this->widgetSchema['parent']->setOption('renderer_options', array(
                'model' => 'Contact',
                'url'   => '/contact/autocomplete',
        ));

        $dateWidget = new sfWidgetFormI18nDate(array(
                        'format' => '%day%/%month%/%year%',
                        'culture'=>'fr'
        ));
        $this->widgetSchema['date_de_paiement'] = new sfWidgetFormJqueryDate(array(
                        'date_widget' => $dateWidget,
                        'culture'=>'fr_FR'
        ));

        $dateWidget = new sfWidgetFormI18nDate(array(
                        'format' => '%day%/%month%/%year%',
                        'culture'=>'fr'
        ));
        $this->widgetSchema['date_de_paiement_second_semestre'] = new sfWidgetFormJqueryDate(array(
                        'date_widget' => $dateWidget,
                        'culture'=>'fr_FR'
        ));

        // check des champs contact et groupe
        // voir la méthode verifierContactOuGroupe() dans InscriptionForm
        $v = new sfValidatorCallback(array(
                        'callback' => array($this, 'verifierContactOuGroupe'),) ,
                array('invalid'  => 'Veuillez choisir un contact OU un groupe.'));

        $this->validatorSchema->setPostValidator($v);


        $this->embedRelation('ListeDesRepresentations');
    }


    // surcharge de la méthode save() pour enregistrer les réservations supplémentaires
    public function save($con = null) {

        // enregistrement des réservations si inscription validée
        // On ne change pas les réservations pour une mise à jour
        if($this->getValue('validee') && $this->getObject()->isNew()) {
            $inscription = parent::save();
            $this->enregistrerReservations($inscription);            
        }else{
            $inscription = parent::save();
        }
        return $inscription;
    }

    
    public function enregistrerReservations($inscription = null){
        $jour = $inscription->getJourDeLaSemaine();
            switch($jour) {
                case 'lundi': $jour = 'Mon';
                    break;
                case 'mardi': $jour = 'Tue';
                    break;
                case 'mercredi': $jour = 'Wed';
                    break;
                case 'jeudi': $jour = 'Thu';
                    break;
                case 'vendredi': $jour = 'Fri';
                    break;
                case 'samedi': $jour = 'Sat';
                    break;
                case 'dimanche': $jour = 'Sun';
                    break;
                default: throw new Exception('Jour incohérent');
            }

            // trouver le jour de la semaine correspondant dans les dates de spectacle à celui choisi pour l'abonnement
            // et enregistrer une réservation
            foreach($inscription->getAbonnement()->getSpectacles() as $spectacle) {
                $representations = $spectacle->getRepresentationSpectacle();
                foreach($representations as $rep) {
                    if(date('D',strtotime($rep->getDate())) == $jour) {

                        // remplissage de l'objet réservation (on le fait à chaque passage car sinon la méthode save() fait des updates
                        $reservation = new Reservation();
                        $reservation->setIdContact($inscription->getIdContact());
                        $reservation->setIdGroupe($inscription->getIdGroupe());
                        $reservation->setIdEvenement($rep->getId());
                        if($reservation->getIdContact()) {
                            $reservation->setNbPers(1);
                        }else {
                            $reservation->setNbPers(count($inscription->getGroupe()->getMembres()));
                        }
                        $reservation->setCommentaire('Réservation issue d\'un abonnement');
                        $reservation->setPrix(0);
                        $reservation->setReduction(0);
                        $reservation->setModeDePaiement($inscription->getModeDePaiement());
                        $reservation->setDateDePaiement($inscription->getDateDePaiement());
                        $reservation->setCodeDePaiement($inscription->getCodeDePaiement());
                        $reservation->setValidee($inscription->getValidee());
                        $reservation->setAnnulee($inscription->getAnnulee());
                        $reservation->setExpiree($inscription->getExpiree());
                        $reservation->setAEnvoyer($inscription->getAEnvoyer());
                        $reservation->setEnvoyee($inscription->getEnvoyee());
                        $reservation->setARembourser($inscription->getARembourser());
                        $reservation->setRemboursee($inscription->getRemboursee());

                        $object = $reservation->save();
                    }
                }
            }
    }
}
